/**
 * 数字类，各种''，null，undefined，返回0
 * 输入：'12'
 * 输出：'12'
 */
export function getValue(value = 0) {
    if (Number(value) === 0) {
        return 0
    } else if (value) {
        return value
    }
}
/**
 * 金额格式化-千分位
 * 输入：'123456789'
 * 输出：'123,456,789'
 */
export const feeHandle = num => {
    return String(num).replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}
/**
 * 金额格式化-金额单位处理
 * 输入：'123456789.456789', 2
 * 输出：{num: '1.23', unit: '亿'}
 */
export function handleMoney(num = 0, jiwei = 2) {
    if (isNaN(num)) num = 0

    let symbol = Number(num) >= 0 ? '' : '-'

    if (symbol === '-') {
        num = String(num).slice(1)
    }

    let AmountUnitlist = ["元", "万", "亿", "万亿", "京", "垓", "杼"]
    let strnum = ""

    if (num === 0) {
        strnum = num.toString()
    } else {
        strnum = num ? num.toString() : ""
    }
    // 声明一个变量用于接收金额单位
    let AmountUnit = ""
    // 循环遍历单位数组
    AmountUnitlist.find((item, index) => {
        let newNum = ""
        // 判断一下传进来的金额是否包含小数点
        if (strnum.indexOf(".") !== -1) {
            // 若有则将小数点前的字符截取出来
            newNum = strnum.substring(0, strnum.indexOf("."))
        } else {
            // 没有则直接等于原金额
            newNum = strnum
        }
        // 判断一下经过小数点截取后的金额字符长度是否小于5
        if (newNum.length < 5) {
            // 若小于5则接收当前单位，并跳出迭代
            AmountUnit = item

            return true
        } else {
            // 若不小于5则将经过小数点截取处理过后的字符除以10000后作为下一轮迭代的初始金额重新判断(每一个单位之间相距4位数，故除以10000)
            strnum = ((newNum * 1) / 10000).toString()
        }
    })

    if (symbol === '-') {
        strnum = '-' + strnum
    }

    let money = { num: 0, unit: "" }
    // 接收数字
    money.num = feeHandle(myFixed(strnum, jiwei))
    // 接收单位
    money.unit = AmountUnit

    return money
}
/**
 * 金额格式化-金额单位处理
 * 输入：'123456789.456789'
 * 输出：'1.23亿'
 */
export function danwei(num = 0, jiwei = 2) {
    return handleMoney(num, jiwei).num + handleMoney(num, jiwei).unit
}
/**
 * 饼图百分比计算逻辑
 * 输入：[11, 22, 33], [{ name: 'A', value: '11' }, { name: 'B', value: '22' }, { name: 'C', value: '33' }], 2
 * 输出：16.67 33.33 50
 */
export function getPercentValue(valueList, idx, precision) {
    // 判断是否为空
    if (!valueList[idx]) {
        return 0;
    }
    // 求和
    var sum = valueList.reduce(function (acc, val) {
        return acc + (isNaN(val) ? 0 : val);
    }, 0)
    if (sum === 0) {
        return 0;
    }
    // 10的2次幂是100，用于计算精度。
    var digits = Math.pow(10, precision);
    // 扩大比例100，
    var votesPerQuota = valueList.map(function (val) {
        return (isNaN(val) ? 0 : val) / sum * digits * 100;
    })
    // 总数，扩大比例意味的总数要扩大
    var targetSeats = digits * 100;
    // 再向下取值，组成数组
    var seats = votesPerQuota.map(function (votes) {
        return Math.floor(votes);
    })
    // 再新计算合计，用于判断与总数量是否相同，相同则占比会100%
    var currentSum = seats.reduce(function (acc, val) {
        return acc + val;
    }, 0)
    // 余数部分的数组：原先数组减去向下取值的数组，得到余数部分的数组
    var remainder = votesPerQuota.map(function (votes, idx) {
        return votes - seats[idx];
    })
    // 给最大最大的余额加1，凑个占比100%；
    while (currentSum < targetSeats) {
        //  找到下一个最大的余额，给其加1
        var max = Number.NEGATIVE_INFINITY;
        var maxId = null;
        for (var i = 0, len = remainder.length; i < len; ++i) {
            if (remainder[i] > max) {
                max = remainder[i];
                maxId = i;
            }
        }
        // 对最大项余额加1
        ++seats[maxId];
        // 已经增加最大余数加1，则下次判断就可以不需要再判断这个余额数。
        remainder[maxId] = 0;
        // 总的也要加1，为了判断是否总数是否相同，跳出循环。
        ++currentSum;
    }
    // 这时候的seats就会总数占比会100%
    return seats[idx] / digits
}
/**
 * 保留小数精度问题-保留n位-四舍五入
 * 输入：'0.06175', '4'
 * 输出：'0.0618'
 */
export const myFixed = (num = 0, n = '2') => {
    if (isNaN(num)) num = 0

    n = parseInt(n)

    if (n <= 0) {
        return Math.round(num)
    }

    num = Math.round(num * Math.pow(10, n)) / Math.pow(10, n)
    num = Number(num).toFixed(n)

    return num
}
/**
 * 判断是否是分数 例如1/2 2/3
 */
export function checkFraction(param) {
    const patt = /^[1-9][\d]*[\/][1-9][\d]*$/

    return patt.test(param)
}
/**
 * 
 * 输入：'123456789'
 * 输出：'1234 5678 9'
 */
export function formatAcctNoSimple(data = '') {
    return data.split('').map(function (item, index) {
        if ((index + 1) % 4 === 0 && index !== data.length) {
            return `${item} `
        }
        return item
    }).join('')
}
/**
 * 
 * 输入：'13384031822', '2-3-4', '_'
 * 输出：'13_384_0318'
 */
export function formatTelNo(val, format = '4-3-4', split = ` `) {
    if (!val) {
        return val
    }
    val = val.trim()
    const arr = format.split('-')
    let m = 0, n, res = ''
    for (let i = 0; i < arr.length; i++) {
        n = m + Number(arr[i])
        res += val.substring(m, n)
        if (i < arr.length - 1) {
            res += split
        }
        m = n
    }
    return res
}
